home *** CD-ROM | disk | FTP | other *** search
- // Source Code: (c) Dieter Spaar
-
- // Freeware, but commercial use must be licensed
-
- // Internet: spaar@mirider.abg.sub.org
-
- // Dieter Spaar
- // Am Gerstenfeld 16
- // 86316 Friedberg
- // Germany
-
-
- // MPW version, use the following command:
-
- // Rez LoadADrive.R -append -o LoadADrive
- // C LoadADrive.c -b -mbg on -sym on -opt off -warnings on -r
- // Link -sym on -l -t APPL -c 'DSLD' -msg dup,multiple,warn -ra %A5Init=resPreload,resLocked LoadADrive.C.o "{Libraries}"Runtime.o "{Libraries}"Interface.o "{CLibraries}"StdCLib.o -o LoadADrive > MAIN.MAP
- // SetFile -a Bi -d . -m . LoadADrive
-
-
- #include <Memory.h>
- #include <Resources.h>
- #include <Fonts.h>
- #include <ToolUtils.h>
- #include <Events.h>
- #include <Windows.h>
- #include <Dialogs.h>
- #include <Controls.h>
- #include <Packages.h>
- #include <Menus.h>
- #include <Strings.h>
- #include <GestaltEqu.h>
- #include <StandardFile.h>
- #include <Aliases.h>
- #include <Files.h>
- #include <Devices.h>
- #include <PLStringFuncs.h>
- #include <StdArg.h>
- #include <StdIO.h>
- #include <StdLib.h>
-
- /* some common constants */
-
- #define TRUE true
- #define FALSE false
- #define NIL nil
-
- /* constants for compiler independency */
- /* here the MPW C-Compiler */
-
- #define STATIC static
- #define EXTERN extern
- #define REGISTER register
- #define VOID void
- #define BYTE char
- #define WORD short
- #define LONG long
- #define BOOL Boolean
- #define UBYTE unsigned char
- #define UWORD unsigned short
- #define ULONG unsigned long
-
- /* Resource */
-
- /* ALRT */
-
- #define ErrorAlert 128
-
- /* alis */
-
- #define INIT_ALIAS 128
-
- /* STR */
-
- #define DriverName 128
-
- VOID eprintf(BYTE *format,...)
- {
- BYTE buf[400];
- va_list arg;
-
- va_start(arg,format);
- vsprintf(buf,format,arg);
- va_end(arg);
-
- c2pstr(buf);
- ParamText(buf,"","","");
- NoteAlert(ErrorAlert,NIL);
- }
-
- /* get filename */
-
- BOOL GetFilename(BYTE *name,WORD *vRefNum)
- {
- Point where;
- SFReply reply;
- SFTypeList typeList;
-
- where.v=50;
- where.h=70;
- typeList[0]='INIT';
- typeList[1]='cdev';
- SFGetFile(where,"",NIL,2,typeList,NIL,&reply);
- PLstrcpy(name,&reply.fName);
- *vRefNum=reply.vRefNum;
-
- return reply.good;
- }
-
- /* Create Alias of file and store it in the resource fork */
-
- BOOL MakeMyAlias(VOID)
- {
- WORD vRefNum;
- Str63 fName;
- FSSpec fSpec;
- OSErr err;
- AliasHandle alias;
- Handle h;
-
- // get filename
-
- if( !GetFilename(fName,&vRefNum) )
- return FALSE;
-
- // make FSSpec
-
- err=FSMakeFSSpec(vRefNum,0,fName,&fSpec);
- if( err!=noErr ) {
- eprintf("Error creating FSSpec.\n(err=%d)",err);
- return FALSE;
- }
-
- // create alias
-
- err=NewAlias(NIL,&fSpec,&alias);
- if( err!=noErr ) {
- eprintf("Error creating Alias.\n(err=%d)",err);
- return FALSE;
- }
-
- // delete old alias in resource
-
- SetResLoad(FALSE);
- h=Get1Resource(rAliasType,INIT_ALIAS);
- SetResLoad(TRUE);
-
- if(h!=NIL && ResError()==noErr) {
- RmveResource(h);
- err=ResError();
- if( err!=noErr )
- eprintf("Cannot remove old Alias from resource fork (maybe File/Drive protected).\n(err=%d)",err);
- }
- if(h!=NIL)
- DisposHandle(h);
-
- // add alias to resource
-
- h=(Handle)alias;
- AddResource(h,rAliasType,INIT_ALIAS,"\pInit");
- err=ResError();
- if(err!=noErr) {
- eprintf("Error adding new Alias to resource fork.\n(err=%d)",err);
- DisposHandle(h);
- return FALSE;
- }
- UpdateResFile(CurResFile());
-
- err=ResError();
- if(err!=noErr) {
- eprintf("Error updating resource fork.\n(err=%d)",err);
- ReleaseResource(h);
- return FALSE;
- }
- ReleaseResource(h);
-
- return TRUE;
- }
-
- /* Resolve file alias */
-
- BOOL ResolveMyAlias(FSSpecPtr initFSSpec)
- {
- Handle h;
- OSErr err;
- BOOL wasChanged;
-
- // get alias
-
- h=Get1Resource(rAliasType,INIT_ALIAS);
- if( h==NIL ) {
- eprintf("Cannot find Alias in resource fork.");
- return FALSE;
- }
-
- // resolve alias
-
- err=ResolveAlias(NIL,(AliasHandle)h,initFSSpec,&wasChanged);
- if(err!=noErr) {
- ReleaseResource(h);
- eprintf("Cannot resolve Alias.\n(err=%d)",err);
- return FALSE;
- }
-
- // maybe update alias
-
- if( wasChanged ) {
- ChangedResource(h);
- UpdateResFile(CurResFile());
- err=ResError();
- if( err!=noErr )
- eprintf("Cannot write back updated Alias.\n(err=%d)",err);
- }
-
- ReleaseResource(h);
-
- return TRUE;
- }
-
- /* check if a modifier key is pressed */
-
- BOOL modifier(WORD mask)
- {
- #if 0 // does not work on some systems
- EventRecord theEvent;
-
- EventAvail(everyEvent, &theEvent);
- if( theEvent.modifiers & mask )
- return TRUE;
- else
- return FALSE;
- #else
- KeyMap theKeys;
- int rotate = 0;
-
- GetKeys(theKeys);
- switch(mask) {
- case cmdKey:
- rotate = 15;
- break;
- case optionKey:
- rotate = 2;
- break;
- case controlKey:
- rotate = 3;
- break;
- }
- return ((theKeys[1] >> rotate) & 0x01) != 0;
- #endif
- }
-
- // this is the whole magic to load the Apple CD-ROM Driver
-
- BOOL LoadInit(FSSpecPtr initFSSpec)
- {
- WORD refNum,ret;
- Handle hdl;
- OSErr err;
- BYTE name[50];
- FInfo fndrInfo;
- BOOL bIsCDEV = FALSE;
-
- // get driver name
-
- name[0]=0;
- hdl=Get1Resource('STR ',DriverName);
- if(hdl) {
- PLstrcpy(name, *hdl);
- ReleaseResource(hdl);
- }
-
- // look for driver
-
- if(name[0]) {
- if(OpenDriver(name,&refNum) == noErr) {
- p2cstr(name);
- eprintf("Driver '%s' already loaded.",name);
- return FALSE;
- }
- }
-
-
- // open resource fork
-
- refNum=FSpOpenResFile(initFSSpec, fsCurPerm);
- err=ResError();
- if(refNum == -1 || err!=noErr) {
- eprintf("Cannot open file '%s'.\n(err=%d)", initFSSpec->name, err);
- return FALSE;
- }
-
- if( FSpGetFInfo(initFSSpec, &fndrInfo) == noErr)
- bIsCDEV = fndrInfo.fdType == 'cdev';
-
- // load INIT into System Zone
-
- SetZone(SystemZone());
- hdl=Get1IndResource('INIT',1);
- if(hdl==0) {
- eprintf("Cannot load INIT from driver.");
- SetZone(ApplicZone());
- CloseResFile(refNum);
- return FALSE;
- }
- HLock(hdl);
- HNoPurge(hdl);
-
- // run INIT
-
- ret=(*(WORD(*)())(*hdl))();
-
- if(HGetState(hdl) & 0x20) // is it still a resource ? (don't unlock if detached)
- {
- HUnlock(hdl);
- ReleaseResource(hdl);
- }
- SetZone(ApplicZone());
- CloseResFile(refNum);
-
- if(ret && !(bIsCDEV && ret == 3)) { // return code always 0 (3 for Spiritâ„¢ CD)?
- eprintf("Cannot initialize Driver.\n(err=%d)",ret);
- if(bIsCDEV)
- PaintOne(nil, GetGrayRgn()); // redraw desktop
- return FALSE;
- }
-
- // look for driver
-
- if(name[0]) {
- if(OpenDriver(name,&refNum) != noErr) {
- p2cstr(name);
- eprintf("Driver '%s' not loaded.",name);
- if(bIsCDEV)
- PaintOne(nil, GetGrayRgn()); // redraw desktop
- return FALSE;
- }
- }
-
- if(bIsCDEV)
- PaintOne(nil, GetGrayRgn()); // redraw desktop
-
- return TRUE;
- }
-
- main()
- {
- Handle hdl;
- FSSpec initFSSpec;
- LONG gesResponse;
-
- // initialisation
-
- MaxApplZone();
- InitGraf(&qd.thePort);
- InitFonts();
- FlushEvents(everyEvent, 0);
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
- // check for essential Mangers
-
- if ( Gestalt (gestaltFSAttr, &gesResponse) || !BitTst(&gesResponse,31 - gestaltFullExtFSDispatching) ||
- !BitTst(&gesResponse,31 - gestaltHasFSSpecCalls) ||
- Gestalt (gestaltAliasMgrAttr, &gesResponse) || !BitTst(&gesResponse,31 - gestaltAliasMgrPresent) ) {
- eprintf("You need the Alias Manager and the File Manager for 'LoadADrive' to run.");
- return;
- }
-
- // command key down: always ask for file
-
- if(modifier(cmdKey))
- hdl=NIL;
- else
- hdl=Get1Resource(rAliasType,INIT_ALIAS);
- if( hdl==NIL ) {
- eprintf("LoadADrive V 1.1\n\nFreeware by Dieter Spaar\nCommercial use must be licensed.\nInterNet: spaar@mirider.abg.sub.org");
- eprintf("Mount CD-ROM without Restart. Select the CD-ROM Driver now.");
- if(!MakeMyAlias())
- return;
- }
- else
- ReleaseResource(hdl);
-
- // get FSSPec of file
-
- while(!ResolveMyAlias(&initFSSpec)) {
- eprintf("Select the CD-ROM Driver now.");
- if(!MakeMyAlias())
- return;
- }
-
- // and now load the file
-
- LoadInit(&initFSSpec);
- }